{
  "name": "Local Assessment Pipeline - Full",
  "nodes": [
    {
      "parameters": {},
      "id": "f7911cfe-3366-4d0f-a647-2f85a03a56b9",
      "name": "Manual Trigger",
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        -736,
        160
      ]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "c7cb77a7-c333-4885-8040-4000920ff1b3",
              "name": "mode",
              "value": "publish_results",
              "type": "string"
            },
            {
              "id": "4012c0a9-6ee9-40d5-b242-171363dd64eb",
              "name": "subject",
              "value": "биология",
              "type": "string"
            },
            {
              "id": "4925489c-7f72-49ed-8883-917d762d3637",
              "name": "grade",
              "value": "7 класс",
              "type": "string"
            },
            {
              "id": "a42e617f-0f60-4877-99e7-e62bc3187a30",
              "name": "topic",
              "value": "фотосинтез",
              "type": "string"
            },
            {
              "id": "5c3463d8-5df3-48a3-afb7-7a26abd39423",
              "name": "difficulty",
              "value": "средний",
              "type": "string"
            },
            {
              "id": "f106a340-c9b9-464d-9189-8e332df15d37",
              "name": "task_count",
              "value": "6",
              "type": "string"
            },
            {
              "id": "36e7a563-4b49-4dd7-88e1-8aed60ab9bf0",
              "name": "task_types",
              "value": "2 тестовых, 2 коротких открытых, 1 на объяснение, 1 на применение",
              "type": "string"
            },
            {
              "id": "cc0c698d-4401-4b25-939c-23e52332b37d",
              "name": "assessment_text",
              "value": "Задание 1. Что является главным источником энергии для фотосинтеза?",
              "type": "string"
            },
            {
              "id": "3db024c1-7110-4f47-8f5a-4100fc36f4f4",
              "name": "answer_key",
              "value": "1) Солнечный свет",
              "type": "string"
            },
            {
              "id": "2b3b28ac-df17-43eb-9dd7-3af32d29098e",
              "name": "student_name",
              "value": "Иванов Илья",
              "type": "string"
            },
            {
              "id": "8e03f0fe-6c99-41b3-b976-6351bd4fd61a",
              "name": "student_answers",
              "value": "1) Солнечный свет",
              "type": "string"
            },
            {
              "id": "db890b71-d7a7-4ef6-a473-b71ab443e57e",
              "name": "grading_scheme",
              "value": "1 балл за полностью верный ответ",
              "type": "string"
            },
            {
              "id": "7d8dac4e-5abd-4ea3-a1aa-b4553146ae1d",
              "name": "grading_result",
              "value": "Задание 1 верно. Итог: 1 из 1.",
              "type": "string"
            },
            {
              "id": "dcf7265a-8d78-4ed8-baef-64b34ecf234f",
              "name": "result_format",
              "value": "короткое сообщение ученику и краткая сводка учителю",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "db99a37c-020a-4a07-b6aa-e14b1d3b92c6",
      "name": "Set Pipeline Input",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -512,
        160
      ]
    },
    {
      "parameters": {
        "rules": {
          "values": [
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 3
                },
                "conditions": [
                  {
                    "id": "a1bae138-8a68-428f-acd2-2275842d5fea",
                    "leftValue": "={{ $json.mode }}",
                    "rightValue": "create_assessment",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    }
                  }
                ],
                "combinator": "and"
              }
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 3
                },
                "conditions": [
                  {
                    "id": "9b40c8b0-370b-4bf1-9442-9f7ea70c71bc",
                    "leftValue": "={{ $json.mode }}",
                    "rightValue": "grade_submissions",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    }
                  }
                ],
                "combinator": "and"
              }
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 3
                },
                "conditions": [
                  {
                    "id": "2c01cc8d-ea35-4655-89cb-f41990c5f260",
                    "leftValue": "={{ $json.mode }}",
                    "rightValue": "publish_results",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    }
                  }
                ],
                "combinator": "and"
              }
            }
          ]
        },
        "options": {}
      },
      "id": "5e687076-7fe2-44e8-84c9-e08c4d85ec8b",
      "name": "Switch",
      "type": "n8n-nodes-base.switch",
      "typeVersion": 3.4,
      "position": [
        -272,
        160
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://openrouter.ai/api/v1/chat/completions",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpBearerAuth",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"model\": \"openrouter/free\",\n  \"temperature\": 0.2,\n  \"messages\": [\n    {\n      \"role\": \"system\",\n      \"content\": \"Ты помогаешь учителю создавать контрольные работы. Пиши ясно, без лишней воды, не выдумывай факты, учитывай возраст и уровень учащихся. Возвращай результат только в трех блоках и ничего больше: CONTROL_WORK, ANSWER_KEY, TEACHER_NOTES. Не показывай reasoning, chain-of-thought или служебные комментарии.\"\n    },\n    {\n      \"role\": \"user\",\n      \"content\": \"Создай контрольную работу.\\n\\nПредмет: {{$json.subject}}\\nКласс: {{$json.grade}}\\nТема: {{$json.topic}}\\nСложность: {{$json.difficulty}}\\nКоличество заданий: {{$json.task_count}}\\nТипы заданий: {{$json.task_types}}\\n\\nТребования:\\n- контрольная должна подходить для реального урока;\\n- задания должны быть разнообразными, но посильными;\\n- после контрольной отдельно дай ключ ответов;\\n- добавь краткое пояснение для учителя, как лучше использовать эту работу.\"\n    }\n  ]\n}\n",
        "options": {}
      },
      "id": "1efb1832-c579-444d-ae6b-f6680e3d167e",
      "name": "LLM Create Assessment",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.4,
      "position": [
        0,
        0
      ],
      "credentials": {
        "httpBearerAuth": {
          "id": "u5iYZqLGWhEcKwbr",
          "name": "Bearer Auth account"
        }
      }
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "79da5f20-53a8-40de-8a50-0f103b72fa6f",
              "name": "assessment_result",
              "value": "={{ $json.choices[0].message.content }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "fe069869-63f4-462f-a415-b50c63e00c32",
      "name": "Extract Assessment Text",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        256,
        0
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://openrouter.ai/api/v1/chat/completions",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpBearerAuth",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"model\": \"openrouter/free\",\n  \"temperature\": 0.1,\n  \"messages\": [\n    {\n      \"role\": \"system\",\n      \"content\": \"Ты помогаешь учителю проверять контрольные работы. Проверяй строго по ключу, не придумывай правильные ответы от себя, объясняй ошибки коротко и понятно. Возвращай результат только в трех блоках: CHECK_BY_TASK, TOTAL_SCORE, TEACHER_COMMENT. Не показывай reasoning, chain-of-thought или служебные комментарии.\"\n    },\n    {\n      \"role\": \"user\",\n      \"content\": \"Проверь работу ученика.\\n\\nПредмет: {{$json.subject}}\\nКласс: {{$json.grade}}\\nТема: {{$json.topic}}\\nСхема оценивания: {{$json.grading_scheme}}\\n\\nТекст контрольной:\\n{{$json.assessment_text}}\\n\\nКлюч ответов:\\n{{$json.answer_key}}\\n\\nУченик: {{$json.student_name}}\\nОтветы ученика:\\n{{$json.student_answers}}\\n\\nТребования:\\n- проверь по каждому заданию;\\n- укажи, где ответ верный, частично верный или неверный;\\n- дай суммарный балл;\\n- коротко поясни основные ошибки;\\n- не делай унижающих или резких формулировок.\"\n    }\n  ]\n}\n",
        "options": {}
      },
      "id": "20cd8b42-f796-4e09-8cae-0df05c10fa76",
      "name": "LLM Grade Submission",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.4,
      "position": [
        0,
        160
      ],
      "credentials": {
        "httpBearerAuth": {
          "id": "u5iYZqLGWhEcKwbr",
          "name": "Bearer Auth account"
        }
      }
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "42148a26-8d89-4752-8f5b-63b2e67fa2ad",
              "name": "grading_result_text",
              "value": "={{ $json.choices[0].message.content }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "36e0213e-dea1-4024-a071-3f9a8a36e3d6",
      "name": "Extract Grading Result",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        256,
        160
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://openrouter.ai/api/v1/chat/completions",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpBearerAuth",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"model\": \"openrouter/free\",\n  \"temperature\": 0.2,\n  \"messages\": [\n    {\n      \"role\": \"system\",\n      \"content\": \"Ты помогаешь учителю выдавать результаты контрольной работы в понятной форме. Возвращай ответ только в трех блоках: STUDENT_MESSAGE, TEACHER_SUMMARY, NEXT_STEPS. Не показывай reasoning, chain-of-thought или служебные комментарии.\"\n    },\n    {\n      \"role\": \"user\",\n      \"content\": \"Подготовь выдачу результатов.\\n\\nУченик: {{$json.student_name}}\\nПредмет: {{$json.subject}}\\nКласс: {{$json.grade}}\\nТема: {{$json.topic}}\\nФормат выдачи: {{$json.result_format}}\\n\\nДанные проверки:\\n{{$json.grading_result}}\\n\\nТребования:\\n- для ученика напиши коротко, понятно и спокойно;\\n- для учителя дай короткое резюме;\\n- добавь 2-3 шага, что повторить или улучшить;\\n- не делай текст слишком длинным.\"\n    }\n  ]\n}\n",
        "options": {}
      },
      "id": "bafe7074-2ce5-4137-a3f6-81f9149a17a8",
      "name": "LLM Publish Results",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.4,
      "position": [
        0,
        320
      ],
      "credentials": {
        "httpBearerAuth": {
          "id": "u5iYZqLGWhEcKwbr",
          "name": "Bearer Auth account"
        }
      }
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "c78c4b4e-2e7b-4e62-9661-b4e3975f8ea2",
              "name": "publish_result_text",
              "value": "={{ $json.choices[0].message.content }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "752695d2-561e-436b-8a42-3b640790fe5c",
      "name": "Extract Publish Result",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        256,
        320
      ]
    }
  ],
  "pinData": {},
  "connections": {
    "Manual Trigger": {
      "main": [
        [
          {
            "node": "Set Pipeline Input",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Pipeline Input": {
      "main": [
        [
          {
            "node": "Switch",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Switch": {
      "main": [
        [
          {
            "node": "LLM Create Assessment",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "LLM Grade Submission",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "LLM Publish Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "LLM Create Assessment": {
      "main": [
        [
          {
            "node": "Extract Assessment Text",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "LLM Grade Submission": {
      "main": [
        [
          {
            "node": "Extract Grading Result",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "LLM Publish Results": {
      "main": [
        [
          {
            "node": "Extract Publish Result",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1",
    "binaryMode": "separate"
  },
  "versionId": "a530587e-ac4f-4110-832b-29bc57b1a952",
  "meta": {
    "instanceId": "add671507eaab6222923f94c3251c45f3699ca28ef6515a6dbba95e9fb1c4898"
  },
  "id": "dghlydyU7yRXrMmp",
  "tags": []
}